%%%funci�n para realizar clustering de n objetos utilizando la estrategia
%%%max-min, con la variante de utilizar un n�mero fijo de clusters
%
%% Q = maxmin(P,k)
%%% Se obtiene de la funci�n, El
%%% conjunto Q q corresponde a los patrones centroides del conjunto P y se
%%% tiene en C una matriz que contiene en sus filas cada uno de los indices
%%% apuntadores a los
%%% clusters resultantes y en sus columnas, los elementos asignados a cada
%%% cluster.
%
%%% Realizado por J.L.Rodr�guez 2007


function Q = maxmin(P,k)

%%%inicializaci�n de variables
lenP = size(P);               %tama�o del conjunto P
lenP = lenP(1);
q_1 = random('unif',1,lenP);    %selecciona aleatoriamente de una distribuci�n uniforme el centro q_1
q = floor(q_1); 
C = []; 
qmas = [];
i = [1:lenP];
ii = i;                         %ii es una variable temporal para recuperarla cada vez q se realice nuevas comparaciones

%%% m�todo
%%% Encuentra los k centroides utilizando max min.
con = 1; %%% es un simple contador
j=1;
t=1;
impr = 1;
bb=0;
hbar = waitbar(0,'procesando centroides...');
while t < k  %% para inicializar los centroides de los clusters.
    lenQ = length(q);    
    Q = P(q,:);               %asigna a Q, los elementos de P que forman el centroide
    R = [];
    Rpos = [];
    i = ii; %%recupera el vector de posiciones de latidos
    i(q) = [];
    lenP = length(i);
    while con <= lenP %% recorrer el conjunto P
        while j <= lenQ
           % dpq(j) = DTW_C(P(i(con),:),Q(j,:));   %realiza la dtw entre el elemento P y los elementos de Q
            dpq(j) = dist(P(i(con),:),Q(j,:)');   %realiza la dtw entre el elemento P y los elementos de Q
            j=j+1;
        end
        [dpq_min,dpq_pos]= min(dpq);    %toma el m�nimo valor siguiendo el criterio max-(min)
        R = [R ; dpq_min];              %esto es para actualizaci�n de datos
        Rpos = [Rpos ; i(con)];
        con = con + 1;
        j=1;
        dpq = [];
        if con == impr*5000
            impr = impr+1;
            s = sprintf('\b');
            s = repmat(s,1,bb);
            fprintf(s);
            s = sprintf('procesando disimilitudes %d', con*lenQ);
            fprintf('%s', s);
            bb = length(s);
        end
    end
    [qval,qpos ]= max(R);               %se toma el m�ximo siguiendo el criterio del (max)-min
    Rfin = Rpos(qpos);
    q = [q ; Rfin];
    t=t+1;
    t;
    con = 1;
    impr = 1;
    bb=0;
    waitbar(t/k,hbar);
end

Q = P(q) ; %%se sabe que q contiene los subindices de los patrones q son centroides del conjunto

%C = kmeans2_NN(P,q,k);
Q = q;

close(hbar)